﻿using System;
using System.IO;
using UtilZ.Dotnet.Ex.Base;

namespace UtilZ.Dotnet.Ex.Communication.Net.Ftp
{
    /// <summary>
    /// 重命名到...
    /// Rename to.
    /// </summary>
    internal class FtpRNTOCommand : FtpCommandAbs
    {
        /***********************************************************************************************************
        * [RNTO]（Rename TO,重命名为）命令
        * 说明：文件重命名进程的后一半。指定要重命名的文件的新路径和文件名。
        * 
        * 用法：RNTO<FileName><CRLF>
        * 参数：FileName是服务器站点上的一个有效文件名。
        * 例子：
        * SendData "RNTO destination.ziP" + “/r/n
        * 
        * 注释：RNTO前面必须是一条"Rename from"命令（RNFR）。RNER和RNTO合在一起才能重命名服务器上的一个文件。
        * 返回值如下（粗体表示成功）：
        * 250  请求的文件操作正常进行，已完成。
        * 421  服务不可用，关闭控制连接。
        * 
        * 如果某项服务获知自己即将关闭，会向所有命令做出这个应答。
        * 500  语法错误，无法识别命令。这其中包括命令行过长之类的错误。
        * 501  参数或变元中有语法错误。
        * 502  命令还没有被实现。
        * 503  命令的顺序不对。
        * 530  无法登录。
        * 532  文件的存储需要帐号。
        * 553  请求的操作无法执行，不允许的文件名。
        * 
        ************************************************************************************************************/


        public FtpRNTOCommand()
            : base()
        {

        }


        protected override string[] GetNames()
        {
            return new string[] { FtpCommands.RNTO };
        }



        protected override IFtpResponse PrimitiveExcute(FtpSession session, string command, string commandLine)
        {
            //Request: RNTO qwe123
            //Response: 250 RNTO command successful.

            try
            {
                if (!session.AllowWrite())
                {
                    return new FtpCodeResponse(FtpStatusCodes.Code550, "Access is denied. ");
                }

                if (!string.Equals(session.LastCommand, FtpCommands.RNFR))
                {
                    return new FtpCodeResponse(FtpStatusCodes.Code503);
                }

                string newName = commandLine;
                if (string.IsNullOrEmpty(commandLine))
                {
                    return new FtpCodeResponse(FtpStatusCodes.Code500, "The folder name parameter is required");
                }

                string oldPath = session.GetLocalPath(session.RenameOldName);
                string newPath = session.GetLocalPath(newName);
                DirectoryInfoEx.CheckFilePathDirectory(newPath);
                Directory.Move(oldPath, newPath);
                return new FtpCodeResponse(FtpStatusCodes.Code250, "RNTO command successful.");
            }
            catch (Exception ex)
            {
                return new FtpCodeResponse(FtpStatusCodes.Code451, ex.Message);
            }
        }
    }

}
